package com.example.systems;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.PostgreSqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.keywords.PostgreSqlKeyWordsHandler;
import com.baomidou.mybatisplus.generator.query.SQLQuery;
import org.apache.ibatis.annotations.Mapper;

import java.util.Collections;

public class CodeGeneratorPostgresql {

    //    private final static String url = "jdbc:mysql://127.0.0.1:3306/eladmin?characterEncoding=UTF-8&useUnicode=true&useSSL=false";
    private final static String url = "jdbc:postgresql://127.0.0.1:5432/postgres?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
    private final static String username = "postgres";
    //    private final static String pd = "abc123";
    private final static String pd = "123456";

    public static void main(String[] args) {
        // 数据库以及连接
        FastAutoGenerator.create(url, username, pd)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("honglujun") // 设置作者
//                            .enableSwagger() // 开启swagger 模式
//                            .fileOverride() // 覆盖已生成的文件
                            .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 指定输出目录
                            .disableOpenDir(); //禁止打开输出目录，默认打开
                })
                // 数据源配置
                .dataSourceConfig(builder ->
                                builder.schema("public") // 数据库的schema
//                                        .keyWordsHandler(new MySqlKeyWordsHandler()) // mysql关键字处理器
//                                        .databaseQueryClass(SQLQuery.class)
//                                        .dbQuery(new MySqlQuery())
//                                        .typeConvert(new MySqlTypeConvert())
                .keyWordsHandler(new PostgreSqlKeyWordsHandler()) // pg关键字处理器
                .databaseQueryClass(SQLQuery.class)
                .dbQuery(new PostgreSqlQuery())
                .typeConvert(new MySqlTypeConvert())
                )
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.example") // 设置父包名
                            .moduleName("systems") // 设置父包模块名
                            .entity("entity")
                            .service("service")
                            .serviceImpl("service.impl")
                            .controller("controller")
                            .mapper("mapper")
                            .xml("mapper")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置mapperXml生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("ch_file_info") // 设置需要生成的表名,多个表名用逗号隔开
                            .addTablePrefix("ch_") // 设置过滤表前缀
                            // Entity 策略配置
                            .entityBuilder()
                            .superClass(Model.class)
                            .enableLombok() //开启 Lombok
                            .enableFileOverride() // 覆盖已生成的文件
//                            .enableChainModel() // 开启链式模式
                            .logicDeleteColumnName("deleted_flag") // 逻辑删除字段
                            .addTableFills(new Column("created_by", FieldFill.INSERT)) // 添加表字段填充
                            .addTableFills(new Column("created_time", FieldFill.INSERT)) // 添加表字段填充
                            .addTableFills(new Column("created_date", FieldFill.INSERT)) // 添加表字段填充
                            .addTableFills(new Column("updated_by", FieldFill.INSERT_UPDATE)) // 添加表字段填充
                            .addTableFills(new Column("updated_time", FieldFill.INSERT_UPDATE)) // 添加表字段填充
                            .addTableFills(new Column("updated_date", FieldFill.INSERT_UPDATE)) // 添加表字段填充
//                            .idType(IdType.AUTO) // 自增主键策略
                            .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略：下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略：下划线转驼峰命
                            // Mapper 策略配置
                            .mapperBuilder()
                            .superClass(BaseMapper.class)
                            .enableFileOverride() // 覆盖已生成的文件
                            .enableBaseResultMap() // 启用 BaseResultMap 生成
                            .enableBaseColumnList() // 启用 BaseColumnList
                            .formatMapperFileName("%sMapper")
                            .formatXmlFileName("%sMapper") // xml名
                            .mapperAnnotation(Mapper.class) // 开启@mapper
                            // Service 策略配置
                            .serviceBuilder()
                            .enableFileOverride() // 覆盖已生成的文件
                            .formatServiceFileName("%sService") // 格式化 service 接口文件名称，%s进行匹配表名，如 UserService
                            .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称，%s进行匹配表名，如 UserServiceImpl
                            // Controller 策略配置
                            .controllerBuilder()
                            .enableFileOverride() // 覆盖已生成的文件
                            .formatFileName("%sController")
                            .enableRestStyle();
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认是Velocity引擎模板
                .execute();

    }

}
